package utils

import (
	"fmt"
	"strings"
	"strconv"
)

/*
你有50枚金币，需要分配给以下几个人：Matthew,Sarah,Augustus,Heidi,Emilie,Peter,Giana,Adriano,Aaron,Elizabeth.
分配规则如下：
a.名字中每包含1个'e'或'E'分1枚金币
b.名字中每包含1个'i'或'I'分2枚金币
c.名字中每包含1个'o'或'O'分3枚金币
d.名字中每包含1个'u'或'U'分4枚金币
写一个程序，计算每个用户分到多少金币，以及最后剩余多少金币？
程序结构如下，请实现 "dispatchCoin" 函数
*/

type people struct {
	name string
	coin int
}

// type person []people

func DispatchCoin() []people {
	// 需要分配的人
	peoples := [10]string{
		"Matthew",
		"Sarah",
		"Augustus",
		"Heidi",
		"Emilie",
		"Peter",
		"Giana",
		"Adriano",
		"Aaron",
		"Elizabeth",
	}

	// 总金币数
	final_coin := 50

	people_obj := new(people)
	person := make([]people, 0, 0)

	// fmt.Println(people_obj)

	for _, v := range peoples {
		// fmt.Println(v)
		people_obj.name = v

		// 计算金币
		coin := getCoinByName(v)
		people_obj.coin = coin

		final_coin -= coin

		person = append(person, *people_obj)

	}

	fmt.Println(person)
	fmt.Println(final_coin)

	return person

}



/**
	根据名字计算应得的金币数
*/
func getCoinByName(name string) int {
	// 转换小写
	name = strings.ToLower(name)

	// arr := [4]map[string]int{
	// 	map[string]int{"e": 1},
	// 	map[string]int{"i": 2},
	// 	map[string]int{"o": 3},
	// 	map[string]int{"u": 4},
	// }
	// 这里有没有办法直接把num定义为int?
	arr := [4]map[string]string{
		map[string]string{"str":"e", "num": "1"},
		map[string]string{"str":"i", "num": "2"},
		map[string]string{"str":"o", "num": "3"},
		map[string]string{"str":"u", "num": "4"},
	}

	num := 0

	for _, v := range arr {

		// 当前字符在此名字中出现的次数
		count := strings.Count(name, v["str"])

		// 每次增加的金币
		num_int, _ := strconv.Atoi(v["num"])

		num = count * num_int + num
		
	}

	return num
}

